// 包含OpenCV的图像处理模块头文件
#include "opencv2/imgproc.hpp"
// 包含OpenCV的高级图形用户界面模块头文件
#include "opencv2/highgui.hpp"

// 使用OpenCV命名空间，避免每次调用OpenCV类和函数时都要加cv::前缀
using namespace cv;

/**
 * @brief 主函数，程序入口
 * @param argc 命令行参数数量
 * @param argv 命令行参数数组
 * @return int 程序退出状态码，0表示正常退出，-1表示摄像头打开失败
 */
int main(int, char**)
{
    // 创建一个VideoCapture对象，尝试打开默认摄像头（索引为0）
    VideoCapture cap(0);
    // 检查摄像头是否成功打开，如果失败则返回-1退出程序
    if(!cap.isOpened()) return -1;

    // 定义两个Mat对象，frame用于存储从摄像头捕获的原始帧，edges用于存储处理后的边缘图像
    Mat frame, edges;
    // 创建一个名为"edges"的窗口，窗口大小会根据显示的图像自动调整
    namedWindow("edges", WINDOW_AUTOSIZE);

    // 进入无限循环，持续处理摄像头捕获的视频帧
    for(;;)
    {
        // 从摄像头读取一帧图像，并将其存储到frame对象中
        cap >> frame;
        // 将彩色图像frame转换为灰度图像，结果存储在edges对象中
        cvtColor(frame, edges, COLOR_BGR2GRAY);
        // 对灰度图像edges进行高斯模糊处理，以减少图像中的噪声
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        // 对经过高斯模糊处理的图像edges进行Canny边缘检测，得到边缘图像
        Canny(edges, edges, 0, 30, 3);
        // 在名为"edges"的窗口中显示处理后的边缘图像
        imshow("edges", edges);
        // 等待30毫秒，检查用户是否按下了任意按键。如果按下了按键，则跳出循环，终止程序
        if(waitKey(30) >= 0) break;
    }
    // 程序正常结束，返回0给操作系统
    return 0;
}